# ТЗ
Разработать REST сервис для хранения паролей. Формат запросов/ответов - JSON.

Сервис должен поддерживать следующие операции:
- Создать новую запись. На вход принимать название записи*, логин, пароль*, ссылка // * обязательные поля
- Получить список всех записей - метод должен возвращать только id и названия. Должна быть версия с пагинацией
- Получить конкретную запись - возвращает все поля
- Обновить запись по Id

---

Добавить аутентификацию и авторизацию. Для авторизации использовать Spring Security + JWT. 

У пользователя должна быть возможность:
- Зарегистрироваться
- Залогиниться по своему имени и паролю

Записи о паролях должны принадлежать пользователю, который их создает. Пользователь не должен иметь доступ к чужим паролям. 

---

Добавить возможность делиться записями.

Например:

- У пользователя Alice есть запись (id 1, login, password). Пользователь Alice вызывает метод поделиться, получает в ответ токен. Этот токен передает пользователю Bob
- Пользователь Bob вызывает метод получение записи по этому токену. Запись копируется в его хранилище

Токен должен быть одноразовым. Т.е. второй раз по нему нельзя получить запись. 

Нужно обрабатывать ситуацию, когда два пользователя пытаются одновременно открыть запись по токену. Получить запись должен только 1 пользователь - 2 получить ошибку. 

При создании токена должна быть возможность указать время его жизни. Если Боб пытается получить запись по токену позже этого времени - он должен получить ошибку. Сделать автоочистку мертвых или просроченных токенов.

---

Добавить метрики. 

Подключить **spring-boot-actuator** и **micrometer** в проект. Поднять локально **Grafana** и **Prometheus**. Импортировать готовый дэшборд (https://grafana.com/grafana/dashboards/4701-jvm-micrometer)

К готовому дэшборду добавить следующие кастомные графики:

- Кол-во попыток получить пошаренную запись по просроченному токену
- Кол-во попыток получить пошаренную запись по уже использованному токену
- Время от создания токена на шаринг до его использования - с 4 линиями на графике 0.5, 0.8, 0.95, 0.99 перцентили

---

Добавить возможность создавать иерархию:
- Добавить метод создания директории. Принимать как опциональный параметр ID существующей директории, в которой создаем вложенную директорию. Если не передали - создаем в корнею.
- В метод создания записи добавить возможность передать ID директории. Если не передали ID - создаем в корневой директории пользователя
- В метод получения записей добавить параметр ID директории. Выводим записи только непосредственно из этой директории. Если не передали - выводим из корня
- Добавить возможность менять директорию, в которой лежит запись
- Добавить метод, возвращающий список вложенных директорий по ID директории, если не передали ID - возвращать список для корня

---

С помощью JMeter провести тестирование производительности своего проекта. 

Тест должен выглядеть следующим образом:
- 5 потоков
- Каждый поток состоит из запросов:
  - Регистрация
  - Авторизация
  - Создание записи 20 раз с таймаутом 300мс
  - Чтение всех своих записей 10 раз с таймаутом 300мс

Начать запускать с максимальным размером кучи 512мб (-Xmx512m) и постепенно уменьшать, пытаясь найти минимальное значение, при котором приложение не падает с ОММ

---

## Результаты домашней работы №10
- Главным требованием было сбор метрик с помощью **Prometheus** и построение графиков с помощью **Grafana**. 
- Итоговые результаты доступны в [этой](https://github.com/avdm2/tinkoff-ab-1/tree/main/HW10%20-%20Results) папке.

## Результаты домашней работы №12

1. Все результаты находятся в [этой](https://github.com/avdm2/tinkoff-ab-1/tree/main/HW12%20-%20Results) папке
2. Наименьший размер кучи, для которого JMeter не падает с OMM оказался равным 27 Мб. Для 26 МБ приложение падает на 
середине отправки всех запросов.
3. Графики получились не очень похожими на то, что в примере, однако достаточно информативными. В целом, самое интересное
происходит в пару секунд после запуска тредпула в JMeter.
4. Файл с конфигурацией JMeter лежит [тут](https://github.com/avdm2/tinkoff-ab-1/blob/main/HW12%20-%20Results/Thread%20Group%20-%20HW12.jmx).

### Куча с размером 27 МБ
Для этого размера кучи я сделал 3 картинки (они лежат в [папке](https://github.com/avdm2/tinkoff-ab-1/tree/main/HW12%20-%20Results/27%20MB) 27 MB):
- Grafana - [График GC](https://github.com/avdm2/tinkoff-ab-1/blob/main/HW12%20-%20Results/27%20MB/%5B27MB%20-%20Grafana%5D%20GC.png)
- Grafana - [График GC во время срабатывания автоматической очистки просроченных токенов](https://github.com/avdm2/tinkoff-ab-1/blob/main/HW12%20-%20Results/27%20MB/%5B27MB%20-%20Grafana%5D%20%D0%A1%D1%80%D0%B0%D0%B1%D0%B0%D1%82%D1%8B%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D0%B0%D0%B2%D1%82%D0%BE%D0%BE%D1%87%D0%B8%D1%81%D1%82%D0%BA%D0%B8.png)
- VisualVM - [График использованной хипом памяти](https://github.com/avdm2/tinkoff-ab-1/blob/main/HW12%20-%20Results/27%20MB/%5B27MB%20-%20VisualVM%5D%20%D0%9F%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%85%D0%B8%D0%BF%D0%B0.png)

### Куча с размером 512 МБ
А здесь получилось 4 картинки (они, соответственно, лежат в [папке](https://github.com/avdm2/tinkoff-ab-1/tree/main/HW12%20-%20Results/512%20MB) 512 MB):
- Grafana - [Сравнение размеров двух хипов с помощью работы GC](https://github.com/avdm2/tinkoff-ab-1/blob/main/HW12%20-%20Results/512%20MB/%5B512MB%20-%20Grafana%5D%20%D0%A1%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%81%20%D1%85%D0%B8%D0%BF%D0%BE%D0%BC%20%D0%BD%D0%B0%2027%20MB.png)
- Grafana - [График GC](https://github.com/avdm2/tinkoff-ab-1/blob/main/HW12%20-%20Results/512%20MB/%5B512MB%20-%20Grafana%5D%20%D0%95%D1%89%D0%B5%20%D0%BE%D0%B4%D0%B8%D0%BD%20%D1%81%D0%BA%D1%80%D0%B8%D0%BD%D1%88%D0%BE%D1%82%20GC.png)
- Grafana - [График GC во время срабатывания автоматической очистки просроченных токенов](https://github.com/avdm2/tinkoff-ab-1/blob/main/HW12%20-%20Results/512%20MB/%5B512MB%20-%20Grafana%5D%20%D0%90%D0%B2%D1%82%D0%BE%D0%BE%D1%87%D0%B8%D1%81%D1%82%D0%BA%D0%B0%20%D0%BF%D1%80%D0%BE%D1%81%D1%80%D0%BE%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D1%85%20%D1%82%D0%BE%D0%BA%D0%B5%D0%BD%D0%BE%D0%B2.png)
- VisualVM - [График использованной хипом памяти](https://github.com/avdm2/tinkoff-ab-1/blob/main/HW12%20-%20Results/512%20MB/%5B512MB%20-%20VisualVM%5D%20%D0%9F%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%85%D0%B8%D0%BF%D0%B0.png)
